// aggiunge alla classe loc i tre operatori -, = e ++

#include <iostream>
using namespace std;

class loc {
	int longitude, latitude;
public:
	loc() {}	// necessario per costruire valori temporanei
	loc(int lg, int lt) {
		longitude = lg;
		latitude = lt;
	}

	void show() {
		cout << longitude << "  ";
		cout << latitude << "\n";
	}

	loc operator+(loc op2);
	loc operator-(loc op2);
	loc operator=(loc op2);
	loc operator++();
};

// Overloading di + per loc

loc loc::operator+(loc op2)
{
	loc temp;

	temp.longitude = op2.longitude + longitude;
	temp.latitude = op2.latitude + latitude;

	return temp;
}

// Overloading di - per loc

loc loc::operator-(loc op2)
{
	loc temp;

	// si noti l'ordine degli operandi
	temp.longitude = longitude - op2.longitude;
	temp.latitude = latitude - op2.latitude;

	return temp;
}

// Overloading dell'assegnamento per loc

loc loc::operator=(loc op2)
{
	longitude = op2.longitude;
	latitude = op2.latitude;

	return *this; // restituisce l'oggetto che ha generato la chiamata
}

// Overloading di ++ (prefisso) per loc

loc loc::operator++()
{
	longitude++;
	latitude++;

	return *this;
}

int main()
{
	loc ob1(10, 20), ob2(5, 30), ob3(90, 90);

	ob1.show();
	ob2.show();

	++ob1;
	ob1.show(); // visualizza 11 21

	ob2 = ++ob1;
	ob1.show(); // visualizza 12 22
	ob2.show(); // visualizza 12 22

	ob1 = ob2 = ob3; // assegnamento multiplo
	ob1.show(); // visualizza 90 90
	ob2.show(); // visualizza 90 90

	return 0;
}
